home *** CD-ROM | disk | FTP | other *** search
/ io Programmo 37 / IOPROG_37.ISO / SOFT / Multilizer.exe / disk1 / data1.cab / data1 / [Group9]VCL Source Standard / ivfimult.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1999-08-12  |  35.8 KB  |  1,478 lines

  1. unit IvFiMult;
  2.  
  3. {$I IVMULTI.INC}
  4.  
  5. interface
  6.  
  7. uses
  8. {$IFDEF WIN32}
  9.   Windows,
  10.   IvWParser,
  11. {$ELSE}
  12.   WinTypes, WinProcs,
  13. {$ENDIF}
  14.   SysUtils, Classes,
  15.   IvParser, IvDictio, IvAMulti;
  16.  
  17. const
  18.   LANGUAGE_RESOURCE_C = 'MlLanguage';
  19.   TRANSLATION_RESOURCE_C = 'MlTranslation';
  20.   LOCALE_RESOURCE_C = 'MlLocale';
  21.  
  22. type
  23.   TIvTextDictionary = class(TIvCustomFileDictionary)
  24.   protected
  25. {$IFDEF IVVB}
  26.     { OCX must read the whole content of these properties,
  27.       because the property stream is available only once.  }
  28.     FAllLanguages: TList;
  29.     FAllLocales: TList;
  30.     FAllTranslations: TMemoryStream;
  31. {$ENDIF}
  32.     FLanguageFileName: String;
  33.     FLocaleFileName: String;
  34.     FLanguageCount: Integer;
  35.     FLocaleCount: Integer;
  36.     FConvert: Boolean;
  37.  
  38.     function GetLanguageFileName: String;
  39.     function GetLocaleFileName: String;
  40.  
  41.     procedure ReadLanguages(reader: TReader); virtual;
  42.     procedure WriteLanguages(writer: TWriter);
  43.  
  44.     procedure ReadTranslations(reader: TReader); virtual;
  45.     procedure WriteTranslations(writer: TWriter);
  46.  
  47.     procedure ReadLocales(reader: TReader); virtual;
  48.     procedure WriteLocales(writer: TWriter);
  49.  
  50.     procedure DefineProperties(filer: TFiler); override;
  51.  
  52.     function GetLanguageCount: Integer; override;
  53.     procedure GetLanguageData(index: Integer; language: TIvLanguage); override;
  54.  
  55.     function GetLocaleCount: Integer; override;
  56.     procedure GetLocaleData(index: Integer; locale: TIvLocale); override;
  57.  
  58.     procedure LoadTranslation; override;
  59.  
  60.   public
  61.     constructor Create(owner: TComponent); override;
  62. {$IFDEF IVVB}
  63.     destructor Destroy; override;
  64. {$ENDIF}
  65.  
  66.     function CanBeOpened: Boolean; override;
  67.  
  68.     procedure GetLanguageDatas(list: TList); override;
  69.     procedure GetLocaleDatas(list: TList); override;
  70.  
  71.     class function GetLanguage(parser: TIvAnsiParser; language: TIvLanguage): Boolean;
  72.     class function GetLocale(parser: TIvAnsiParser; locale: TIvLocale): Boolean;
  73.  
  74. {$IFDEF WIN32}
  75.     class function GetLanguageW(parser: TIvWideParser; language: TIvLanguage): Boolean;
  76.     class function GetLocaleW(parser: TIvWideParser; locale: TIvLocale): Boolean;
  77. {$ENDIF}
  78.  
  79.     class function GetContextType(
  80. {$IFDEF WIN32}
  81.       const line: String;
  82. {$ELSE}
  83.       line: PChar;
  84. {$ENDIF}
  85.       languageCount: Integer): TIvContextType;
  86.  
  87. {$IFDEF WIN32}
  88.     class function GetContextTypeW(
  89.   {$IFDEF IVWIDE}
  90.       const line: WideString;
  91.   {$ELSE}
  92.       line: PWideChar;
  93.   {$ENDIF}
  94.       languageCount: Integer): TIvContextType;
  95. {$ENDIF}
  96.  
  97.   published
  98.     property LanguageFileName: String read GetLanguageFileName write FLanguageFileName;
  99.     property LocaleFileName: String read GetLocaleFileName write FLocaleFileName;
  100.     property Convert: Boolean read FConvert write FConvert default True;
  101.   end;
  102.  
  103.   TIvFileDictionary = class(TIvTextDictionary)
  104.   end;
  105.  
  106.   function IsUnicodeFile(const filename: String): Boolean;
  107. {$IFDEF WIN32}
  108.   function IsUnicodeResource(const resourceName: String): Boolean;
  109. {$ENDIF}
  110.  
  111. implementation
  112.  
  113. uses
  114. {$IFDEF IVVB}
  115.   MultiOCX,      { VBEmbeddedXXX methods }
  116. {$ENDIF}
  117. {$IFDEF WIN32}
  118.   IvWReader,
  119. {$ENDIF}
  120.   IvMlRead, IvReader;
  121.  
  122. {$IFNDEF WIN32}
  123. const
  124.   NO_UNICODE_SUPPORT_C = '16-bit Multilizer does not support Unicode files!';
  125. {$ENDIF}
  126.  
  127. constructor TIvTextDictionary.Create(owner: TComponent);
  128. begin
  129.   inherited Create(owner);
  130.   FLanguageCount := 0;
  131.   FLocaleCount := 0;
  132.   FConvert := True;
  133.  
  134. {$IFDEF IVVB}
  135.   FAllLanguages := TList.Create;
  136.   FAllLocales   := TList.Create;
  137.   FAllTranslations := TMemoryStream.Create;
  138. {$ENDIF}
  139. end;
  140.  
  141. {$IFDEF IVVB}
  142. destructor TIvTextDictionary.Destroy;
  143. begin
  144.   FreeList(FAllLanguages);
  145.   FreeList(FAllLocales);
  146.   FAllTranslations.Free;
  147.   inherited Destroy;
  148. end;
  149. {$ENDIF}
  150.  
  151. function TIvTextDictionary.GetLanguageFileName: String;
  152. begin
  153. {$IFNDEF IVVB}
  154.   if not IsDesignTime then
  155.     FLanguageFilename := ExpandFileName(FLanguageFilename);
  156. {$ENDIF}
  157.   Result := FLanguageFilename;
  158. end;
  159.  
  160. function TIvTextDictionary.GetLocaleFileName: String;
  161. begin
  162. {$IFNDEF IVVB}
  163.   if not IsDesignTime then
  164.     FLocaleFilename := ExpandFileName(FLocaleFilename);
  165. {$ENDIF}
  166.   Result := FLocaleFilename;
  167. end;
  168.  
  169. function TIvTextDictionary.CanBeOpened: Boolean;
  170. begin
  171.   Result := inherited CanBeOpened and
  172.     (FStorage <> ivsFile) or
  173.     (
  174. {$IFNDEF WIN32}
  175.       (LocaleFileName <> '') and FileExists(LocaleFileName) and
  176. {$ENDIF}
  177.       (LanguageFileName <> '') and FileExists(LanguageFileName)
  178.     );
  179. end;
  180.  
  181. procedure TIvTextDictionary.ReadLanguages(reader: TReader);
  182. begin
  183. {$IFDEF IVVB}
  184.   if Storage = ivsEmbedded then
  185.     FLanguageCount := VBEmbeddedReadLanguages(reader, FAllLanguages)
  186.   else
  187. {$ENDIF}
  188.     FLanguageCount := TIvReader.SkipLanguages(reader);
  189. end;
  190.  
  191. procedure TIvTextDictionary.WriteLanguages(writer: TWriter);
  192. var
  193.   i: Integer;
  194. begin
  195.   writer.WriteListBegin;
  196.   writer.WriteInteger(LANGUAGES_VERSION_C);
  197.   writer.WriteInteger(LanguageCount);
  198.   for i := 0 to LanguageCount - 1 do
  199.     TIvReader.WriteLanguage(writer, Languages[i]);
  200.   writer.WriteListEnd;
  201. end;
  202.  
  203. procedure TIvTextDictionary.ReadTranslations(reader: TReader);
  204. begin
  205. {$IFDEF IVVB}
  206.   if Storage = ivsEmbedded then
  207.     VBEmbeddedReadTranslations(reader, FLanguageCount, FAllTranslations)
  208.   else
  209. {$ENDIF}
  210.     TIvReader.SkipTranslations(reader, FLanguageCount);
  211. end;
  212.  
  213. class function TIvTextDictionary.GetContextType(
  214. {$IFDEF WIN32}
  215.   const line: String;
  216. {$ELSE}
  217.   line: PChar;
  218. {$ENDIF}
  219.   languageCount: Integer): TIvContextType;
  220. var
  221.   i, tabCount: Integer;
  222. begin
  223.   tabCount := 0;
  224. {$IFDEF WIN32}
  225.   for i := 1 to Length(line) do
  226.     if line[i] = #9 then
  227.       Inc(tabCount);
  228. {$ELSE}
  229.   for i := 0 to StrLen(line) - 1 do
  230.     if line[i] = #9 then
  231.       Inc(tabCount);
  232. {$ENDIF}
  233.  
  234.   if tabCount = languageCount then
  235.     Result := [ivctComponent]
  236.   else if tabCount > languageCount then
  237.     Result := [ivctForm, ivctComponent]
  238.   else
  239.     Result := [];
  240. end;
  241.  
  242. {$IFDEF WIN32}
  243. class function TIvTextDictionary.GetContextTypeW(
  244. {$IFDEF IVWIDE}
  245.   const line: WideString;
  246. {$ELSE}
  247.   line: PWideChar;
  248. {$ENDIF}
  249.   languageCount: Integer): TIvContextType;
  250. var
  251.   i, tabCount: Integer;
  252. begin
  253.   tabCount := 0;
  254. {$IFDEF IVWIDE}
  255.   for i := 1 to Length(line) do
  256.     if line[i] = #9 then
  257.       Inc(tabCount);
  258. {$ELSE}
  259.   for i := 0 to SysStringLen(line) - 1 do
  260.     if line[i] = #9 then
  261.       Inc(tabCount);
  262. {$ENDIF}
  263.  
  264.   if tabCount = languageCount then
  265.     Result := [ivctComponent]
  266.   else if tabCount > languageCount then
  267.     Result := [ivctForm, ivctComponent]
  268.   else
  269.     Result := [];
  270. end;
  271. {$ENDIF}
  272.  
  273. procedure TIvTextDictionary.WriteTranslations(writer: TWriter);
  274. var
  275.   i, j, count: Integer;
  276.   parser: TIvAnsiParser;
  277.   reader: TIvAnsiReader;
  278.   context: TIvContextType;
  279. {$IFDEF WIN32}
  280.   str: String;
  281. {$ELSE}
  282.   str: PChar;
  283. {$ENDIF}
  284. begin
  285.   context := [];
  286.  
  287.   reader := TIvAnsiReader.Create;
  288.   reader.StorageName := Filename;
  289.   reader.Open;
  290.   count := 0;
  291.   while not reader.Eof do
  292.   begin
  293.     str := reader.ReadLine;
  294.     if count = 0 then
  295.       context := GetContextType(str, LanguageCount);
  296. {$IFNDEF WIN32}
  297.     StrDispose(str);
  298. {$ENDIF}
  299.     Inc(count);
  300.   end;
  301.   reader.Close;
  302.  
  303.   reader.Open;
  304.   writer.WriteListBegin;
  305.   writer.WriteInteger(TRANSLATIONS_VERSION_C);
  306.   writer.WriteInteger(Integer(TIvContext.ContextTypeToCode(context)));
  307.   writer.WriteInteger(count);
  308.   for i := 0 to count - 1 do
  309.   begin
  310.     parser := TIvAnsiParser.CreateValue(reader.ReadLine, #9);
  311.     try
  312.       writer.WriteListBegin;
  313.       for j := 0 to LanguageCount - 1 do
  314.       begin
  315.         writer.WriteString(parser.GetString);
  316.         if j = 0 then
  317.         begin
  318.           if ivctForm in context then
  319.             writer.WriteString(parser.GetString);
  320.           if ivctComponent in context then
  321.             writer.WriteString(parser.GetString);
  322.         end;
  323.       end;
  324.       writer.WriteListEnd;
  325.     finally
  326.       parser.Free;
  327.     end;
  328.   end;
  329.   writer.WriteListEnd;
  330.  
  331.   reader.Free;
  332. end;
  333.  
  334. procedure TIvTextDictionary.ReadLocales(reader: TReader);
  335. begin
  336. {$IFDEF IVVB}
  337.   if Storage = ivsEmbedded then
  338.     FLocaleCount := VBEmbeddedReadLocales(reader, FAllLocales)
  339.   else
  340. {$ENDIF}
  341.     FLocaleCount := TIvReader.SkipLocales(reader);
  342. end;
  343.  
  344. procedure TIvTextDictionary.WriteLocales(writer: TWriter);
  345. var
  346.   i: Integer;
  347. begin
  348.   writer.WriteListBegin;
  349.   writer.WriteInteger(LOCALES_VERSION_C);
  350.   writer.WriteInteger(LocaleCount);
  351.   for i := 0 to LocaleCount - 1 do
  352.     TIvReader.WriteLocale(writer, Locales[i]);
  353.   writer.WriteListEnd;
  354. end;
  355.  
  356. procedure TIvTextDictionary.DefineProperties(filer: TFiler);
  357.  
  358.   function HasData(const fileName: String): Boolean;
  359. {$IFNDEF WIN32}
  360.   var
  361.     buffer: array[0..255] of Char;
  362. {$ENDIF}
  363.   begin
  364.     if filer is TReader then
  365.       Result := True
  366.     else
  367.     begin
  368.       Result := False;
  369.       if fileName <> '' then
  370.       begin
  371.         if not FileExists(fileName) then
  372.           MessageBox(
  373.             0,
  374. {$IFDEF WIN32}PChar({$ELSE}StrPCopy(buffer,{$ENDIF}
  375.             'Can not find the file name ' + fileName + '. No table data was stored!'),
  376.             'File not found',
  377.             MB_OK)
  378.         else if IsUnicodeFile(fileName) then
  379.           MessageBox(
  380.             0,
  381. {$IFDEF WIN32}PChar({$ELSE}StrPCopy(buffer,{$ENDIF}
  382.             'Can not use a Unicode file ' + fileName + '. No table data was stored!'),
  383.             'Unicode not supported',
  384.             MB_OK)
  385.         else
  386.           Result := True;
  387.       end;
  388.     end;
  389.   end;
  390.  
  391. begin
  392.   inherited DefineProperties(filer);
  393.  
  394.   if FStorage = ivsEmbedded then
  395.   begin
  396.     if (Filename <> '') and (LanguageFileName = '') then
  397.       raise Exception.Create('No language file assigned');
  398.     if (Filename = '') and (LanguageFileName <> '') then
  399.       raise Exception.Create('No translation file assigned');
  400.  
  401.     HasData(LocaleFileName);
  402.  
  403.     if HasData(LanguageFileName) and HasData(Filename) and (filer is TWriter) then
  404.       Open;
  405.  
  406.     try
  407.       filer.DefineProperty(LANGUAGES_C, ReadLanguages, WriteLanguages, HasData(LanguageFileName));
  408.       filer.DefineProperty(TRANSLATIONS_C, ReadTranslations, WriteTranslations, HasData(Filename));
  409.       filer.DefineProperty(LOCALES_C, ReadLocales, WriteLocales, HasData(LocaleFileName));
  410.     finally
  411.       if (filer is TWriter) and IsOpen then
  412.         Close;
  413.     end;
  414.   end;
  415. end;
  416.  
  417. function TIvTextDictionary.GetLanguageCount: Integer;
  418.  
  419.   function GetAnsiCount(reader: TIvBaseReader; name: String): Integer;
  420.   begin
  421.     Result := 0;
  422.     try
  423.       reader.StorageName := name;
  424.       reader.Open;
  425.       while not reader.Eof do
  426.       begin
  427.         reader.ReadLine;
  428.         Inc(Result);
  429.       end;
  430.     finally
  431.       reader.Free;
  432.     end;
  433.   end;
  434.  
  435. {$IFDEF WIN32}
  436.   function GetWideCount(reader: TIvBaseWideReader; name: String): Integer;
  437.   begin
  438.     Result := 0;
  439.     try
  440.       reader.StorageName := name;
  441.       reader.Open;
  442.       while not reader.Eof do
  443.       begin
  444.         reader.ReadLine;
  445.         Inc(Result);
  446.       end;
  447.     finally
  448.       reader.Free;
  449.     end;
  450.   end;
  451. {$ENDIF}
  452.  
  453. begin
  454.   if IsDesignTime or (FStorage = ivsFile) then
  455.   begin
  456.     if IsUnicodeFile(LanguageFileName) then
  457. {$IFDEF WIN32}
  458.       Result := GetWideCount(TIvWideReader.Create, LanguageFileName)
  459. {$ELSE}
  460.       raise EIvMulti.Create(NO_UNICODE_SUPPORT_C)
  461. {$ENDIF}
  462.     else
  463.       Result := GetAnsiCount(TIvAnsiReader.Create, LanguageFileName);
  464.   end
  465.   else if FStorage = ivsEmbedded then
  466.     Result := FLanguageCount
  467.   else
  468.   begin
  469. {$IFDEF WIN32}
  470.     if IsUnicodeResource(LANGUAGE_RESOURCE_C) then
  471.       Result := GetWideCount(TIvResourceWideReader.Create, LANGUAGE_RESOURCE_C)
  472.     else
  473.       Result := GetAnsiCount(TIvResourceAnsiReader.Create, LANGUAGE_RESOURCE_C);
  474. {$ENDIF}
  475.   end;
  476. end;
  477.  
  478. procedure TIvTextDictionary.GetLanguageData(index: Integer; language: TIvLanguage);
  479.  
  480.   procedure GetAnsiData(reader: TIvBaseReader; name: String);
  481.   var
  482.     i: Integer;
  483.     parser: TIvAnsiParser;
  484.   begin
  485.     parser := TIvAnsiParser.Create;
  486.     try
  487.       reader.StorageName := name;
  488.       reader.Open;
  489.  
  490.       for i := 0 to index do
  491.         parser.Value := reader.ReadLine;
  492.  
  493.       GetLanguage(parser, language);
  494.     finally
  495.       reader.Free;
  496.       parser.Free;
  497.     end;
  498.   end;
  499.  
  500. {$IFDEF WIN32}
  501.   procedure GetWideData(reader: TIvBaseWideReader; name: String);
  502.   var
  503.     i: Integer;
  504.     parser: TIvWideParser;
  505.   begin
  506.     parser := TIvWideParser.Create;
  507.     try
  508.       reader.StorageName := name;
  509.       reader.Open;
  510.  
  511.       for i := 0 to index do
  512.         parser.Value := reader.ReadLine;
  513.  
  514.       GetLanguageW(parser, language);
  515.     finally
  516.       reader.Free;
  517.       parser.Free;
  518.     end;
  519.   end;
  520. {$ENDIF}
  521.  
  522. begin
  523.   if IsDesignTime or (FStorage = ivsFile) then
  524.   begin
  525.     if IsUnicodeFile(LanguageFileName) then
  526. {$IFDEF WIN32}
  527.       GetWideData(TIvWideReader.Create, LanguageFileName)
  528. {$ELSE}
  529.       raise EIvMulti.Create(NO_UNICODE_SUPPORT_C)
  530. {$ENDIF}
  531.     else
  532.       GetAnsiData(TIvAnsiReader.Create, LanguageFileName);
  533.   end
  534.   else if FStorage = ivsEmbedded then
  535. {$IFDEF IVVB}
  536.     VBEmbeddedGetLanguageData(index, language, FAllLanguages)
  537. {$ELSE}
  538.     TIvReader.GetLanguageData(Owner.ClassName, ClassName, Name, index, language)
  539. {$ENDIF}
  540.   else
  541.   begin
  542. {$IFDEF WIN32}
  543.     if IsUnicodeResource(LANGUAGE_RESOURCE_C) then
  544.       GetWideData(TIvResourceWideReader.Create, LANGUAGE_RESOURCE_C)
  545.     else
  546.       GetAnsiData(TIvResourceAnsiReader.Create, LANGUAGE_RESOURCE_C);
  547. {$ENDIF}
  548.   end;
  549. end;
  550.  
  551. procedure TIvTextDictionary.GetLanguageDatas(list: TList);
  552.  
  553.   procedure GetAnsiDatas(reader: TIvBaseReader; name: String);
  554.   var
  555.     parser: TIvAnsiParser;
  556.     language: TIvLanguage;
  557.   begin
  558.     parser := TIvAnsiParser.Create;
  559.     try
  560.       reader.StorageName := name;
  561.       reader.Open;
  562.       while not reader.Eof do
  563.       begin
  564.         language := TIvLanguage.Create;
  565.         parser.Value := reader.ReadLine;
  566.         GetLanguage(parser, language);
  567.         list.Add(language);
  568.       end;
  569.     finally
  570.       reader.Free;
  571.       parser.Free;
  572.     end;
  573.   end;
  574.  
  575. {$IFDEF WIN32}
  576.   procedure GetWideDatas(reader: TIvBaseWideReader; name: String);
  577.   var
  578.     parser: TIvWideParser;
  579.     language: TIvLanguage;
  580.   begin
  581.     parser := TIvWideParser.Create;
  582.     try
  583.       reader.StorageName := name;
  584.       reader.Open;
  585.       while not reader.Eof do
  586.       begin
  587.         language := TIvLanguage.Create;
  588.         parser.Value := reader.ReadLine;
  589.         GetLanguageW(parser, language);
  590.         list.Add(language);
  591.       end;
  592.     finally
  593.       reader.Free;
  594.       parser.Free;
  595.     end;
  596.   end;
  597. {$ENDIF}
  598.  
  599. begin
  600.   if IsDesignTime or (FStorage = ivsFile) then
  601.   begin
  602.     if LanguageFileName = '' then
  603.       raise EIvMulti.Create('No language file given');
  604.  
  605.     if not FileExists(LanguageFileName) then
  606.       raise EIvMulti.Create('Language file "' + LanguageFileName + '" not found');
  607.  
  608.     if IsUnicodeFile(LanguageFileName) then
  609. {$IFDEF WIN32}
  610.       GetWideDatas(TIvWideReader.Create, LanguageFileName)
  611. {$ELSE}
  612.       raise EIvMulti.Create(NO_UNICODE_SUPPORT_C)
  613. {$ENDIF}
  614.     else
  615.       GetAnsiDatas(TIvAnsiReader.Create, LanguageFileName);
  616.   end
  617.   else if FStorage = ivsEmbedded then
  618. {$IFDEF IVVB}
  619.     VBEmbeddedGetLanguageDatas(list, FAllLanguages)
  620. {$ELSE}
  621.     TIvReader.GetLanguageDatas(Owner.ClassName, ClassName, Name, list)
  622. {$ENDIF}
  623.   else
  624.   begin
  625. {$IFDEF WIN32}
  626.     if IsUnicodeResource(LANGUAGE_RESOURCE_C) then
  627.       GetWideDatas(TIvResourceWideReader.Create, LANGUAGE_RESOURCE_C)
  628.     else
  629.       GetAnsiDatas(TIvResourceAnsiReader.Create, LANGUAGE_RESOURCE_C);
  630. {$ENDIF}
  631.   end;
  632. end;
  633.  
  634. function TIvTextDictionary.GetLocaleCount: Integer;
  635.  
  636.   function GetAnsiCount(reader: TIvBaseReader; name: String): Integer;
  637.   begin
  638.     Result := 0;
  639.     if LocaleFileName = '' then
  640.       Exit;
  641.  
  642.     try
  643.       reader.StorageName := name;
  644.       reader.Open;
  645.       while not reader.Eof do
  646.       begin
  647.         reader.ReadLine;
  648.         Inc(Result);
  649.       end;
  650.     finally
  651.       reader.Free;
  652.     end;
  653.   end;
  654.  
  655. {$IFDEF WIN32}
  656.   function GetWideCount(reader: TIvBaseWideReader; name: String): Integer;
  657.   begin
  658.     Result := 0;
  659.     if LocaleFileName = '' then
  660.       Exit;
  661.  
  662.     try
  663.       reader.StorageName := name;
  664.       reader.Open;
  665.       while not reader.Eof do
  666.       begin
  667.         reader.ReadLine;
  668.         Inc(Result);
  669.       end;
  670.     finally
  671.       reader.Free;
  672.     end;
  673.   end;
  674. {$ENDIF}
  675.  
  676. begin
  677.   if IsDesignTime or (FStorage = ivsFile) then
  678.   begin
  679.     if IsUnicodeFile(LocaleFileName) then
  680. {$IFDEF WIN32}
  681.       Result := GetWideCount(TIvWideReader.Create, LocaleFileName)
  682. {$ELSE}
  683.       raise EIvMulti.Create(NO_UNICODE_SUPPORT_C)
  684. {$ENDIF}
  685.     else
  686.       Result := GetAnsiCount(TIvAnsiReader.Create, LocaleFileName);
  687.   end
  688.   else if FStorage = ivsEmbedded then
  689.     Result := FLocaleCount
  690.   else
  691.   begin
  692. {$IFDEF WIN32}
  693.     if IsUnicodeResource(LOCALE_RESOURCE_C) then
  694.       Result := GetWideCount(TIvResourceWideReader.Create, LOCALE_RESOURCE_C)
  695.     else
  696.       Result := GetAnsiCount(TIvResourceAnsiReader.Create, LOCALE_RESOURCE_C);
  697. {$ENDIF}
  698.   end;
  699. end;
  700.  
  701. procedure TIvTextDictionary.GetLocaleData(index: Integer; locale: TIvLocale);
  702.  
  703.   procedure GetAnsiData(reader: TIvBaseReader; name: String);
  704.   var
  705.     i: Integer;
  706.     parser: TIvAnsiParser;
  707.   begin
  708.     parser := TIvAnsiParser.Create;
  709.     try
  710.       reader.StorageName := name;
  711.       reader.Open;
  712.  
  713.       for i := 0 to index do
  714.         parser.Value := reader.ReadLine;
  715.  
  716.       GetLocale(parser, locale);
  717.     finally
  718.       reader.Free;
  719.       parser.Free;
  720.     end;
  721.   end;
  722.  
  723. {$IFDEF WIN32}
  724.   procedure GetWideData(reader: TIvBaseWideReader; name: String);
  725.   var
  726.     i: Integer;
  727.     parser: TIvWideParser;
  728.   begin
  729.     parser := TIvWideParser.Create;
  730.     try
  731.       reader.StorageName := name;
  732.       reader.Open;
  733.  
  734.       for i := 0 to index do
  735.         parser.Value := reader.ReadLine;
  736.  
  737.       GetLocaleW(parser, locale);
  738.     finally
  739.       reader.Free;
  740.       parser.Free;
  741.     end;
  742.   end;
  743. {$ENDIF}
  744.  
  745. begin
  746.   if IsDesignTime or (FStorage = ivsFile) then
  747.   begin
  748. {$IFNDEF WIN32}
  749.     if LocaleFileName = '' then
  750.       raise EIvMulti.Create('No locale file given');
  751. {$ELSE}
  752.     if LocaleFileName = '' then
  753.       Exit;
  754. {$ENDIF}
  755.  
  756.     if (LocaleFileName <> '') and not FileExists(LocaleFileName) then
  757.       raise EIvMulti.Create('Locale file "' + LocaleFileName + '" not found');
  758.  
  759.     if IsUnicodeFile(LocaleFileName) then
  760. {$IFDEF WIN32}
  761.       GetWideData(TIvWideReader.Create, LocaleFileName)
  762. {$ELSE}
  763.       raise EIvMulti.Create(NO_UNICODE_SUPPORT_C)
  764. {$ENDIF}
  765.     else
  766.       GetAnsiData(TIvAnsiReader.Create, LocaleFileName);
  767.   end
  768.   else if FStorage = ivsEmbedded then
  769. {$IFDEF IVVB}
  770.     VBEmbeddedGetLocaleData(index, locale, FAllLocales)
  771. {$ELSE}
  772.     TIvReader.GetLocaleData(Owner.ClassName, ClassName, Name, index, locale)
  773. {$ENDIF}
  774.   else
  775.   begin
  776. {$IFDEF WIN32}
  777.     if IsUnicodeResource(LOCALE_RESOURCE_C) then
  778.       GetWideData(TIvResourceWideReader.Create, LOCALE_RESOURCE_C)
  779.     else
  780.       GetAnsiData(TIvResourceAnsiReader.Create, LOCALE_RESOURCE_C);
  781. {$ENDIF}
  782.   end;
  783. end;
  784.  
  785. procedure TIvTextDictionary.GetLocaleDatas(list: TList);
  786.  
  787.   procedure GetAnsiDatas(reader: TIvBaseReader; name: String);
  788.   var
  789.     parser: TIvAnsiParser;
  790.     locale: TIvLocale;
  791.   begin
  792.     parser := TIvAnsiParser.Create;
  793.     try
  794.       reader.StorageName := name;
  795.       reader.Open;
  796.       while not reader.Eof do
  797.       begin
  798.         locale := TIvLocale.Create;
  799.         parser.Value := reader.ReadLine;
  800.         GetLocale(parser, locale);
  801.         list.Add(locale);
  802.       end;
  803.     finally
  804.       reader.Free;
  805.       parser.Free;
  806.     end;
  807.   end;
  808.  
  809. {$IFDEF WIN32}
  810.   procedure GetWideDatas(reader: TIvBaseWideReader; name: String);
  811.   var
  812.     parser: TIvWideParser;
  813.     locale: TIvLocale;
  814.   begin
  815.     parser := TIvWideParser.Create;
  816.     try
  817.       reader.StorageName := name;
  818.       reader.Open;
  819.       while not reader.Eof do
  820.       begin
  821.         locale := TIvLocale.Create;
  822.         parser.Value := reader.ReadLine;
  823.         GetLocaleW(parser, locale);
  824.         list.Add(locale);
  825.       end;
  826.     finally
  827.       reader.Free;
  828.       parser.Free;
  829.     end;
  830.   end;
  831. {$ENDIF}
  832.  
  833. begin
  834.   if IsDesignTime or (FStorage = ivsFile) then
  835.   begin
  836. {$IFNDEF WIN32}
  837.     if LocaleFileName = '' then
  838.       raise EIvMulti.Create('No locale file given');
  839. {$ELSE}
  840.     if LocaleFileName = '' then
  841.       Exit;
  842. {$ENDIF}
  843.  
  844.     if (LocaleFileName <> '') and not FileExists(LocaleFileName) then
  845.       raise EIvMulti.Create('Locale file "' + LocaleFileName + '" not found');
  846.  
  847.     if IsUnicodeFile(LocaleFileName) then
  848. {$IFDEF WIN32}
  849.       GetWideDatas(TIvWideReader.Create, LocaleFileName)
  850. {$ELSE}
  851.       raise EIvMulti.Create(NO_UNICODE_SUPPORT_C)
  852. {$ENDIF}
  853.     else
  854.       GetAnsiDatas(TIvAnsiReader.Create, LocaleFileName);
  855.   end
  856.   else if FStorage = ivsEmbedded then
  857.   begin
  858.     if FLocaleCount > 0 then
  859. {$IFDEF IVVB}
  860.       VBEmbeddedGetLocaleDatas(list, FAllLocales)
  861. {$ELSE}
  862.       TIvReader.GetLocaleDatas(Owner.ClassName, ClassName, Name, list)
  863. {$ENDIF}
  864.   end
  865.   else
  866.   begin
  867. {$IFDEF WIN32}
  868.     if IsUnicodeResource(LOCALE_RESOURCE_C) then
  869.       GetWideDatas(TIvResourceWideReader.Create, LOCALE_RESOURCE_C)
  870.     else
  871.       GetAnsiDatas(TIvResourceAnsiReader.Create, LOCALE_RESOURCE_C);
  872. {$ENDIF}
  873.   end;
  874. end;
  875.  
  876. procedure TIvTextDictionary.LoadTranslation;
  877.  
  878.   procedure LoadAnsi(reader: TIvBaseReader; name: String);
  879.   var
  880.     i, j: Integer;
  881.     parser: TIvAnsiParser;
  882.     translation: TIvTranslation;
  883.   begin
  884.     parser := TIvAnsiParser.Create;
  885.     try
  886.       parser.Convert := Convert;
  887.       i := 0;
  888.       reader.StorageName := name;
  889.       reader.Open;
  890.       while not reader.Eof do
  891.       begin
  892.         parser.Value := reader.ReadLine;
  893.  
  894.         if i = 0 then
  895.           FContextType := GetContextType(parser.Value, LanguageCount);
  896.         Inc(i);
  897.  
  898.         translation := TIvTranslation.Create;
  899.         translation.Str := parser.GetString;
  900.  
  901.         if ivctForm in FContextType then
  902.           translation.Form := parser.GetString;
  903.  
  904.         if ivctComponent in FContextType then
  905.           translation.Component := parser.GetString;
  906.  
  907.         if ActiveLanguage = 0 then
  908.           translation.Current := translation.Str
  909.         else
  910.         begin
  911.           for j := 1 to ActiveLanguage - 1 do
  912.             parser.GetString;
  913.           translation.Current := parser.GetString;
  914.         end;
  915.  
  916. {$IFNDEF WIN32}
  917.         parser.Value := nil;
  918. {$ENDIF}
  919.  
  920.         FTranslations.Add(translation);
  921.       end;
  922.     finally
  923.       reader.Free;
  924.       parser.Free;
  925.     end;
  926.   end;
  927.  
  928. {$IFDEF WIN32}
  929.   procedure LoadWide(reader: TIvBaseWideReader; name: String);
  930.   var
  931.     i, j, codePage: Integer;
  932.     parser: TIvWideParser;
  933.     translation: TIvTranslation;
  934.   begin
  935.     codePage := Languages[ActiveLanguage].CodePage;
  936.     parser := TIvWideParser.Create;
  937.     try
  938.       parser.Convert := Convert;
  939.       i := 0;
  940.       reader.StorageName := name;
  941.       reader.Open;
  942.       while not reader.Eof do
  943.       begin
  944.         parser.Value := reader.ReadLine;
  945.  
  946.         if i = 0 then
  947.           FContextType := GetContextTypeW(parser.Value, LanguageCount);
  948.         Inc(i);
  949.  
  950.         translation := TIvTranslation.Create;
  951.         translation.Str := parser.GetAnsiString;
  952.  
  953.         if ivctForm in FContextType then
  954.           translation.Form := parser.GetAnsiString;
  955.  
  956.         if ivctComponent in FContextType then
  957.           translation.Component := parser.GetAnsiString;
  958.  
  959.         if ActiveLanguage = 0 then
  960.           translation.Current := translation.Str
  961.         else
  962.         begin
  963.           for j := 1 to ActiveLanguage - 1 do
  964.             parser.GetString;
  965.           translation.Current := IvWStrToStr(parser.GetString, codePage);
  966.         end;
  967.  
  968.         FTranslations.Add(translation);
  969.       end;
  970.     finally
  971.       reader.Free;
  972.       parser.Free;
  973.     end;
  974.   end;
  975. {$ENDIF}
  976.  
  977. begin
  978.   ClearTranslations;
  979.  
  980.   if IsDesignTime or (FStorage = ivsFile) then
  981.   begin
  982.     if Filename = '' then
  983.       raise EIvMulti.Create('No translation file given');
  984.  
  985.     if not FileExists(Filename) then
  986.       raise EIvMulti.Create('Translation file "' + Filename + '" not found');
  987.  
  988.     if IsUnicodeFile(Filename) then
  989. {$IFDEF WIN32}
  990.       LoadWide(TIvWideReader.Create, Filename)
  991. {$ELSE}
  992.       raise EIvMulti.Create(NO_UNICODE_SUPPORT_C)
  993. {$ENDIF}
  994.     else
  995.       LoadAnsi(TIvAnsiReader.Create, Filename);
  996.   end
  997.   else if FStorage = ivsEmbedded then
  998.   begin
  999. {$IFDEF IVVB}
  1000.     FContextType := VBEmbeddedLoadTranslation(
  1001.       ActiveLanguage,
  1002.       LanguageCount,
  1003.       FTranslations,
  1004.       FAllTranslations);
  1005. {$ELSE}
  1006.     FContextType := TIvReader.LoadTranslation(
  1007.       Owner.ClassName,
  1008.       ClassName,
  1009.       Name,
  1010.       ActiveLanguage,
  1011.       LanguageCount,
  1012.       FTranslations);
  1013. {$ENDIF}
  1014.   end
  1015.   else
  1016.   begin
  1017. {$IFDEF WIN32}
  1018.     if IsUnicodeResource(TRANSLATION_RESOURCE_C) then
  1019.       LoadWide(TIvResourceWideReader.Create, TRANSLATION_RESOURCE_C)
  1020.     else
  1021.       LoadAnsi(TIvResourceAnsiReader.Create, TRANSLATION_RESOURCE_C);
  1022. {$ENDIF}
  1023.   end;
  1024.  
  1025.   Sort;
  1026. end;
  1027.  
  1028. class function TIvTextDictionary.GetLanguage(parser: TIvAnsiParser; language: TIvLanguage): Boolean;
  1029. var
  1030.   str: String;
  1031. begin
  1032.   Result := False;
  1033.  
  1034.   language.EnglishName := parser.GetString;
  1035.   language.NativeName := parser.GetString;
  1036.   language.Primary := parser.GetInteger;
  1037.   language.AllSubs := parser.GetString;
  1038.   language.DefaultSub := parser.GetInteger;
  1039.   language.FontName := parser.GetString;
  1040.  
  1041.   str := parser.GetString;
  1042.   if str <> '' then
  1043.     language.FontSize := StrToIntDef(str, 0)
  1044.   else
  1045.   begin
  1046.     language.FontSize := 0;
  1047.     Result := True;
  1048.   end;
  1049.  
  1050.   str := parser.GetString;
  1051.   if str <> '' then
  1052.     language.OptionsAsInt := StrToIntDef(str, 0)
  1053.   else
  1054.   begin
  1055.     language.OptionsAsInt := 0;
  1056.     Result := True;
  1057.   end;
  1058.  
  1059.   str := parser.GetString;
  1060. {$IFDEF WIN32}
  1061.   if str <> '' then
  1062.     language.Charset := StrToIntDef(str, 0)
  1063.   else
  1064.   begin
  1065.     language.Charset := 0;
  1066.     Result := True;
  1067.   end;
  1068. {$ENDIF}
  1069.  
  1070.   str := parser.GetString;
  1071.   if str <> '' then
  1072.     language.CodePage := StrToIntDef(str, 0)
  1073.   else
  1074.   begin
  1075.     language.CodePage := 0;
  1076.     Result := True;
  1077.   end;
  1078.  
  1079.   if not parser.Eol then
  1080.     language.ISOLanguage := parser.GetString
  1081.   else
  1082.     Result := True;
  1083.  
  1084.   if not parser.Eol then
  1085.     language.ISOAllCountries := parser.GetString
  1086.   else
  1087.     Result := True;
  1088.  
  1089.   if not parser.Eol then
  1090.     language.ISODefaultCountry := parser.GetString
  1091.   else
  1092.     Result := True;
  1093.  
  1094.   language.Init;
  1095. end;
  1096.  
  1097. class function TIvTextDictionary.GetLocale(parser: TIvAnsiParser; locale: TIvLocale): Boolean;
  1098. var
  1099.   j: Integer;
  1100. begin
  1101.   { The function returns True if the given data is in the old format }
  1102.  
  1103.   Result := False;
  1104.  
  1105.   locale.Primary := parser.GetInteger;
  1106.   locale.Sub := parser.GetInteger;
  1107.   parser.GetInteger; { Locale is not used }
  1108.   locale.EnglishLanguageName := parser.GetString;
  1109.   locale.NativeLanguageName := parser.GetString;
  1110.   locale.EnglishCountryName := parser.GetString;
  1111.   locale.NativeCountryName := parser.GetString;
  1112.   locale.CodePage := parser.GetInteger;
  1113.  
  1114.   locale.MeasurementSystem := TIvMeasurementSystem(parser.GetInteger);
  1115.   locale.CurrencyString := parser.GetString;
  1116.   locale.CurrencyFormat := TIvCurrencyFormat(parser.GetInteger);
  1117.   locale.NegCurrFormat := TIvNegativeCurrencyFormat(parser.GetInteger);
  1118.   locale.ThousandSeparator := parser.GetChar;
  1119.   locale.DecimalSeparator := parser.GetChar;
  1120.   locale.CurrencyDecimals := parser.GetInteger;
  1121.  
  1122.   locale.DateSeparator := parser.GetChar;
  1123.   locale.ShortDateFormat := parser.GetString;
  1124.   locale.LongDateFormat := parser.GetString;
  1125.  
  1126.   locale.TimeSeparator := parser.GetChar;
  1127.   locale.TimeAMString := parser.GetString;
  1128.   locale.TimePMString := parser.GetString;
  1129.   locale.TimeLeadingZeros := parser.GetBoolean;
  1130.   locale.TimeFormat := TIvTimeFormat(parser.GetInteger);
  1131.  
  1132.   locale.CalendarType := TIvCalendarType(parser.GetInteger);
  1133.   locale.OptionalCalendarType := TIvCalendarType(parser.GetInteger);
  1134.   locale.FirstDayOfWeek := TIvDayOfWeek(parser.GetInteger);
  1135.   locale.FirstWeekOfYear := TIvFirstWeekOfYear(parser.GetInteger);
  1136.  
  1137.   for j := 1 to 12 do
  1138.     locale.ShortMonthNames[j] := parser.GetString;
  1139.  
  1140.   for j := 1 to 12 do
  1141.     locale.LongMonthNames[j] := parser.GetString;
  1142.  
  1143.   for j := 1 to 7 do
  1144.     locale.ShortDayNames[j] := parser.GetString;
  1145.  
  1146.   for j := 1 to 7 do
  1147.     locale.LongDayNames[j] := parser.GetString;
  1148.  
  1149.   { The following items are new in ML 3.0 }
  1150.  
  1151.   if not parser.Eol then
  1152.     locale.Win16LanguageName := parser.GetString
  1153.   else
  1154.   begin
  1155.     locale.Win16LanguageName := '';
  1156.     Result := True;
  1157.   end;
  1158.  
  1159.   if not parser.Eol then
  1160.     locale.Win16CountryName := parser.GetString
  1161.   else
  1162.   begin
  1163.     locale.Win16CountryName := '';
  1164.     Result := True;
  1165.   end;
  1166.  
  1167.   if not parser.Eol then
  1168.     locale.TimeMarkPosition := TIvTimeMarkPosition(parser.GetInteger)
  1169.   else
  1170.   begin
  1171.     locale.TimeMarkPosition := ivtmSuffix;
  1172.     Result := True;
  1173.   end;
  1174.  
  1175.   if not parser.Eol then
  1176.     locale.ISOLanguage := parser.GetString
  1177.   else
  1178.   begin
  1179.     locale.ISOLanguage := '';
  1180.     Result := True;
  1181.   end;
  1182.  
  1183.   if not parser.Eol then
  1184.     locale.ISOCountry := parser.GetString
  1185.   else
  1186.   begin
  1187.     locale.ISOCountry := '';
  1188.     Result := True;
  1189.   end;
  1190.  
  1191.   if not parser.Eol then
  1192.     locale.IsCustom := parser.GetBoolean
  1193.   else
  1194.   begin
  1195.     locale.IsCustom := False;
  1196.     Result := True;
  1197.   end;
  1198.  
  1199.   { The following items are new in ML 4.0 }
  1200.  
  1201. {$IFDEF WIN32}
  1202.   if not parser.Eol then
  1203.     locale.Charset := parser.GetInteger
  1204.   else
  1205.   begin
  1206.     locale.Charset := 0;
  1207.     Result := True;
  1208.   end;
  1209. {$ENDIF}
  1210.  
  1211.   locale.Init;
  1212. end;
  1213.  
  1214. {$IFDEF WIN32}
  1215. class function TIvTextDictionary.GetLanguageW(
  1216.   parser: TIvWideParser;
  1217.   language: TIvLanguage): Boolean;
  1218. var
  1219.   str: String;
  1220.   nativeName: TIvWideString;
  1221. begin
  1222.   Result := False;
  1223.  
  1224.   language.EnglishName := parser.GetAnsiString;
  1225.   nativeName := parser.GetString;
  1226.   language.Primary := parser.GetInteger;
  1227.   language.AllSubs := parser.GetAnsiString;
  1228.   language.DefaultSub := parser.GetInteger;
  1229.   language.FontName := parser.GetAnsiString;
  1230.  
  1231.   str := parser.GetAnsiString;
  1232.   if str <> '' then
  1233.     language.FontSize := StrToIntDef(str, 0)
  1234.   else
  1235.   begin
  1236.     language.FontSize := 0;
  1237.     Result := True;
  1238.   end;
  1239.  
  1240.   str := parser.GetAnsiString;
  1241.   if str <> '' then
  1242.     language.OptionsAsInt := StrToIntDef(str, 0)
  1243.   else
  1244.   begin
  1245.     language.OptionsAsInt := 0;
  1246.     Result := True;
  1247.   end;
  1248.  
  1249.   str := parser.GetAnsiString;
  1250.   if str <> '' then
  1251.     language.Charset := StrToIntDef(str, 0)
  1252.   else
  1253.   begin
  1254.     language.Charset := 0;
  1255.     Result := True;
  1256.   end;
  1257.  
  1258.   str := parser.GetAnsiString;
  1259.   if str <> '' then
  1260.     language.CodePage := StrToIntDef(str, 0)
  1261.   else
  1262.   begin
  1263.     language.CodePage := 0;
  1264.     Result := True;
  1265.   end;
  1266.  
  1267.   language.NativeName := IvWStrToStr(nativeName, language.CodePage);
  1268.  
  1269.   if not parser.Eol then
  1270.     language.ISOLanguage := parser.GetAnsiString
  1271.   else
  1272.     Result := True;
  1273.  
  1274.   if not parser.Eol then
  1275.     language.ISOAllCountries := parser.GetAnsiString
  1276.   else
  1277.     Result := True;
  1278.  
  1279.   if not parser.Eol then
  1280.     language.ISODefaultCountry := parser.GetAnsiString
  1281.   else
  1282.     Result := True;
  1283.  
  1284.   language.Init;
  1285. end;
  1286.  
  1287. class function TIvTextDictionary.GetLocaleW(
  1288.   parser: TIvWideParser;
  1289.   locale: TIvLocale): Boolean;
  1290. var
  1291.   j: Integer;
  1292.   nativeLanguageNameW, nativeCountryNameW: TIvWideString;
  1293. begin
  1294.   { The function returns True if the given data is in the old format }
  1295.  
  1296.   Result := False;
  1297.  
  1298.   locale.Primary := parser.GetInteger;
  1299.   locale.Sub := parser.GetInteger;
  1300.   parser.GetInteger; { Locale is not used }
  1301.   locale.EnglishLanguageName := parser.GetAnsiString;
  1302.   nativeLanguageNameW := parser.GetString;
  1303.   locale.EnglishCountryName := parser.GetAnsiString;
  1304.   nativeCountryNameW := parser.GetString;
  1305.   locale.CodePage := parser.GetInteger;
  1306.   parser.CodePage := locale.CodePage;
  1307.   locale.NativeLanguageName := IvWStrToStr(nativeLanguageNameW, locale.CodePage);
  1308.   locale.NativeCountryName := IvWStrToStr(nativeCountryNameW, locale.CodePage);
  1309.  
  1310.   locale.MeasurementSystem := TIvMeasurementSystem(parser.GetInteger);
  1311.   locale.CurrencyString := parser.GetAnsiString;
  1312.   locale.CurrencyFormat := TIvCurrencyFormat(parser.GetInteger);
  1313.   locale.NegCurrFormat := TIvNegativeCurrencyFormat(parser.GetInteger);
  1314.   locale.ThousandSeparator := parser.GetAnsiChar;
  1315.   locale.DecimalSeparator := parser.GetAnsiChar;
  1316.   locale.CurrencyDecimals := parser.GetInteger;
  1317.  
  1318.   locale.DateSeparator := parser.GetAnsiChar;
  1319.   locale.ShortDateFormat := parser.GetAnsiString;
  1320.   locale.LongDateFormat := parser.GetAnsiString;
  1321.  
  1322.   locale.TimeSeparator := parser.GetAnsiChar;
  1323.   locale.TimeAMString := parser.GetAnsiString;
  1324.   locale.TimePMString := parser.GetAnsiString;
  1325.   locale.TimeLeadingZeros := parser.GetBoolean;
  1326.   locale.TimeFormat := TIvTimeFormat(parser.GetInteger);
  1327.  
  1328.   locale.CalendarType := TIvCalendarType(parser.GetInteger);
  1329.   locale.OptionalCalendarType := TIvCalendarType(parser.GetInteger);
  1330.   locale.FirstDayOfWeek := TIvDayOfWeek(parser.GetInteger);
  1331.   locale.FirstWeekOfYear := TIvFirstWeekOfYear(parser.GetInteger);
  1332.  
  1333.   for j := 1 to 12 do
  1334.     locale.ShortMonthNames[j] := parser.GetAnsiString;
  1335.  
  1336.   for j := 1 to 12 do
  1337.     locale.LongMonthNames[j] := parser.GetAnsiString;
  1338.  
  1339.   for j := 1 to 7 do
  1340.     locale.ShortDayNames[j] := parser.GetAnsiString;
  1341.  
  1342.   for j := 1 to 7 do
  1343.     locale.LongDayNames[j] := parser.GetAnsiString;
  1344.  
  1345.   { The following items are new in ML 3.0 }
  1346.  
  1347.   if not parser.Eol then
  1348.     locale.Win16LanguageName := parser.GetAnsiString
  1349.   else
  1350.   begin
  1351.     locale.Win16LanguageName := '';
  1352.     Result := True;
  1353.   end;
  1354.  
  1355.   if not parser.Eol then
  1356.     locale.Win16CountryName := parser.GetAnsiString
  1357.   else
  1358.   begin
  1359.     locale.Win16CountryName := '';
  1360.     Result := True;
  1361.   end;
  1362.  
  1363.   if not parser.Eol then
  1364.     locale.TimeMarkPosition := TIvTimeMarkPosition(parser.GetInteger)
  1365.   else
  1366.   begin
  1367.     locale.TimeMarkPosition := ivtmSuffix;
  1368.     Result := True;
  1369.   end;
  1370.  
  1371.   if not parser.Eol then
  1372.     locale.ISOLanguage := parser.GetAnsiString
  1373.   else
  1374.   begin
  1375.     locale.ISOLanguage := '';
  1376.     Result := True;
  1377.   end;
  1378.  
  1379.   if not parser.Eol then
  1380.     locale.ISOCountry := parser.GetAnsiString
  1381.   else
  1382.   begin
  1383.     locale.ISOCountry := '';
  1384.     Result := True;
  1385.   end;
  1386.  
  1387.   if not parser.Eol then
  1388.     locale.IsCustom := parser.GetBoolean
  1389.   else
  1390.   begin
  1391.     locale.IsCustom := False;
  1392.     Result := True;
  1393.   end;
  1394.  
  1395.   { The following items are new in ML 4.0 }
  1396.  
  1397.   if not parser.Eol then
  1398.     locale.Charset := parser.GetInteger
  1399.   else
  1400.   begin
  1401.     locale.Charset := 0;
  1402.     Result := True;
  1403.   end;
  1404.  
  1405.   locale.Init;
  1406. end;
  1407. {$ENDIF}
  1408.  
  1409. function IsUnicodeFile(const filename: String): Boolean;
  1410. var
  1411.   c: Char;
  1412.   f: TextFile;
  1413. begin
  1414.   Result := False;
  1415.   if not FileExists(filename) then
  1416.     Exit;
  1417.  
  1418.   AssignFile(f, filename);
  1419.   Reset(f);
  1420.   try
  1421.     if not Eof(f) then
  1422.     begin
  1423.       Read(f, c);
  1424.       if c = Chr($FF) then
  1425.       begin
  1426.         { Little endian }
  1427.  
  1428.         if not Eof(f) then
  1429.         begin
  1430.           Read(f, c);
  1431.           Result := c = Chr($FE);
  1432.         end;
  1433.       end
  1434.       else if c = Chr($FE) then
  1435.       begin
  1436.         { Big endian }
  1437.  
  1438.         if not Eof(f) then
  1439.         begin
  1440.           Read(f, c);
  1441.           Result := c = Chr($FF);
  1442.         end;
  1443.       end;
  1444.     end;
  1445.   finally
  1446.     Close(f);
  1447.   end;
  1448. end;
  1449.  
  1450. {$IFDEF WIN32}
  1451. function IsUnicodeResource(const resourceName: String): Boolean;
  1452. var
  1453.   resource: HRSRC;
  1454.   handle: HGLOBAL;
  1455.   buffer: PChar;
  1456. begin
  1457.   resource := FindResource(HInstance, PChar(resourceName), MULTILIZER_RES_TYPE_C);
  1458.   if resource = 0 then
  1459.     raise EInOutError.Create('Could not open the resource ' + resourceName);
  1460.  
  1461.   handle := LoadResource(HInstance, resource);
  1462.   if handle = 0 then
  1463.     raise EInOutError.Create('Could not open the resource ' + resourceName);
  1464.  
  1465.   Result := False;
  1466.   try
  1467.     buffer := LockResource(handle);
  1468.     Result :=
  1469.       ((buffer^ = Chr($FF)) and ((buffer + 1)^ = Chr($FE))) or
  1470.       ((buffer^ = Chr($FE)) and ((buffer + 1)^ = Chr($FF)));
  1471.   except
  1472.   end;
  1473. end;
  1474. {$ENDIF}
  1475.  
  1476. end.
  1477.  
  1478.